package com.b04643e33b5867fd.webviewdemo;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Environment;
import android.view.KeyEvent;
import android.webkit.JavascriptInterface;
import android.webkit.PermissionRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.content.Intent;
import android.net.Uri;
import android.webkit.SslErrorHandler;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import java.io.File;
import java.io.FileOutputStream;
import android.app.Dialog;
import android.content.Context;
import android.provider.MediaStore;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import android.app.AlertDialog;
import android.Manifest;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


public class MainActivity extends AppCompatActivity {

    private static Context context;
    private String baseUrl = "https://www.baidu.com";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.AppTheme);
        setContentView(R.layout.activity_main);
        this.createWebView();
        context= this;
        // 获取版本号

    }

    /* 创建 WebView 实例 */
    @SuppressLint("SetJavaScriptEnabled")
    private void createWebView() {
        // 创建 WebView 实例并通过 id 绑定我们刚在布局中创建的 WebView 标签
        final WebView webView = (WebView) findViewById(R.id.webview);
        setPermissions(webView);  // 初始化权限
        MyInterface myInterface = new MyInterface(this);
        webView.addJavascriptInterface(myInterface, "interfacePre"); // 监听js方法
        // 确保跳转到另一个网页时仍然在当前 WebView 中显示
        // 而不是调用浏览器打开
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // 如下方案可在非微信内部WebView的H5页面中调出微信支付
                if (url.startsWith("weixin://wap/pay?")) {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                    return true;
                }
                return super.shouldOverrideUrlLoading(view, url);
            }

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) { // 重写此方法可以让webview处理https请求
                handler.proceed();
            }
        });

        // 设置 WebView 的 WebChromeClient 的摄像头权限
        webView.setWebChromeClient(new android.webkit.WebChromeClient() {
            @Override
            public void onPermissionRequest(final PermissionRequest request) {
                request.grant(request.getResources());
            }
        });

        // 设置 WebView 的按键监听器，覆写监听器的 onKey 函数，对返回键作特殊处理
        // 当 WebView 可以返回到上一个页面时回到上一个页面
        webView.setOnKeyListener((v, keyCode, event) -> {
            if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
                webView.goBack();
                return true;
            }
            return false;
        });
        // webview长按保存图片
        webView.setOnLongClickListener(v -> {
            // 获取点击的标签
            WebView.HitTestResult result = webView.getHitTestResult();
            // 如果是图片类型或者是带有图片链接的类型
            if (null == result) {
                return false;
            }
            int type = result.getType();
            if (type == WebView.HitTestResult.IMAGE_TYPE || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
                // 弹出保存图片的对话框
                onCreateDialog(
                        "保存图片",
                        "是否保存图片？",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // 下载图片到本地
                                saveImage(result.getExtra());
                            }
                        }
                ).show();
            }
            return false;
        });

        // 加载指定网页
        String url = "http://b04643e33b5867fd.saas.test.siwimeta.com?vconsole=b14d1e9baeced9bb7525ab19ee35f2d2";
        webView.loadUrl(url);
        getVersion(baseUrl);

    }

    // 更新下载应用新版本
    public void updateApp(String url) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));
        startActivity(intent);
    }

    // 判断本地版本和服务器版本是否一致如果不一致则更新
    public void checkVersion(String version, String url) {
        // 获取安卓应用的版本号
        String localVersion = BuildConfig.VERSION_NAME;
        System.out.println("本地版本：" + localVersion+"服务器版本："+version);
//        对比本地版本：1.1.1服务器版本：1.2.2
        if (!localVersion.equals(version)) {
//           主线程提示更新
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // 弹出更新提示框
                    onCreateDialog(
                            "更新提示",
                            "有新版本，是否更新？",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    // 下载应用
                                    updateApp(url);
                                }
                            }
                    ).show();
                }
            });
        }
    }
    // 获取版本号
    public void getVersion(String url) {
        // 封装请求参数
        JSONObject jsonObject = new JSONObject();
        // 获取当前应用的包名
        String packageName = "com.b04643e33b5867fd.webviewdemo";
        try {
            jsonObject.put("package_name", packageName);
            jsonObject.put("page", 1);
            jsonObject.put("page_size", 10);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        // 发送请求
        post(url, jsonObject.toString());

    }

    // 发送post请求使用okhttp
    public void post(String url, String json) {
        // 创建okHttpClient对象
        OkHttpClient okHttpClient = new OkHttpClient();
        // 创建一个Request
        Request request = new Request.Builder()
                .url(url)
                .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json))
                .build();
        // new call
        Call call = okHttpClient.newCall(request);
        // 请求加入调度
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) { }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                // 请求成功
                String result = response.body().string();
                try {
                    JSONObject jsonObject = new JSONObject(result);
//                    取jsonObject 下面的data.list 数组
                    JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("list");    // 获取jsonObject下面的data.list数组
//                    遍历数组取得第一个status为3的数据
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                        int status = jsonObject1.getInt("status");
                        if (status == 3) {
                            String version = jsonObject1.getString("app_version");
                            String url = jsonObject1.getString("cdn");
                            checkVersion(version, url);
                            break;
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    // 内容为保存图片

//    封装弹窗方法 接收标题 内容 和 点确定的回调
    public Dialog onCreateDialog(String title, String message, DialogInterface.OnClickListener onClickListener) {
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle(title);
        builder.setMessage(message);
        builder.setPositiveButton("确定", onClickListener);
        builder.setNegativeButton("取消", null);
        return builder.create();
    }

    // 保存图片
    public void saveImage(String url) {
        // 获取图片
        Glide.with(context).load(url).into(new CustomTarget<Drawable>() {
            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                // 获取bitmap
                BitmapDrawable bitmapDrawable = (BitmapDrawable) resource;
                Bitmap bitmap = bitmapDrawable.getBitmap();
                // 获取内置SD卡路径
                String sdCardPath = Environment.getExternalStorageDirectory().getPath();
                // 图片文件路径 /Android/data/<package name>/files/
                String filePath = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getPath() + File.separator + System.currentTimeMillis() + ".png";
                // 保存图片
                File file = new File(filePath);
                try {
                    FileOutputStream fileOutputStream = new FileOutputStream(file);
                    // 通过io流的方式来压缩保存图片
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
                    fileOutputStream.flush();
                    fileOutputStream.close();
                    // 通知图库更新
                    MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, filePath, null);
                    Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                    Uri uri = Uri.fromFile(file);
                    intent.setData(uri);
                    context.sendBroadcast(intent);
                    Toast.makeText(context, "保存成功", Toast.LENGTH_SHORT).show();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onLoadCleared(@Nullable Drawable placeholder) {
            }
        });
    }
//    初始化权限

    public void setPermissions(WebView webView) {
        // 设置 WebView 允许执行 JavaScript 脚本
        webView.getSettings().setJavaScriptEnabled(true);
        // 设置 WebView 允许本地存储
        webView.getSettings().setDomStorageEnabled(true);
        // 设置 WebView 允许使用缓存
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setLoadsImagesAutomatically(true);
        // 设置 WebView 允许使用文件协议
        webView.getSettings().setAllowFileAccess(true);
        // 设置 WebView 允许使用定位功能
        webView.getSettings().setGeolocationEnabled(true);
        // 设置 WebView 允许使用摄像头
        webView.getSettings().setMediaPlaybackRequiresUserGesture(false);
        // 是否允许通过file url加载的Javascript读取本地文件，默认值 false
        webView.getSettings().setAllowFileAccessFromFileURLs(true);
        // 是否允许通过file url加载的Javascript读取全部资源(包括文件,http,https)，默认值 false
        webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
        // 设置 WebView 允许使用混合协议
        webView.getSettings().setMixedContentMode(0);
        // 设置 WebView 有摄像头权限
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

        webView.getSettings().setGeolocationDatabasePath(getFilesDir().getPath());
        webView.getSettings().setDatabaseEnabled(true);

        // 允许https和http混合使用
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            webView.getSettings().setMixedContentMode(android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }

    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        PackageManager packageManager = this.getPackageManager();
        PermissionInfo permissionInfo = null;
        for (int i = 0; i < permissions.length; i++) {
            try {
                permissionInfo = packageManager.getPermissionInfo(permissions[i], 0);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            CharSequence permissionName = permissionInfo.loadLabel(packageManager);
            if (grantResults[i] != PackageManager.PERMISSION_GRANTED){
                Toast.makeText(context, "您拒绝了【" + permissionName + "】权限", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
class MyInterface {
    private final Context context;
    private String[] permissions = new String[]{
            Manifest.permission.CAMERA,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };
    private final int MY_REQUEST_CODE = 1000;
    public MyInterface(Context context) {
        this.context = context;
    }

    /**
     * 方法可以自带入参和返回值
     */
    @JavascriptInterface
    public void permission() {
        setPermission();
    }

    /**
     * 处理权限
     */
    public void setPermission(){
        PackageManager packageManager = this.context.getPackageManager();
        PermissionInfo permissionInfo = null;
        for (int i = 0; i < permissions.length; i++) {
            try {
                permissionInfo = packageManager.getPermissionInfo(permissions[i], 0);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            CharSequence permissionName = permissionInfo.loadLabel(packageManager);
            if (ContextCompat.checkSelfPermission(this.context, permissions[i]) != PackageManager.PERMISSION_GRANTED){
                if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) this.context, permissions[i])){
                    // 这是一个坑，某些手机弹出提示时没有永不询问的复选框，点击拒绝就默认勾上了这个复选框，而某些手机上即使勾选上了永不询问的复选框也不起作用
                    Toast.makeText(context, "您勾选了不再提示【" + permissionName + "】权限的申请", Toast.LENGTH_SHORT).show();
                } else {
                    ActivityCompat.requestPermissions((Activity) this.context, permissions, MY_REQUEST_CODE);
                }
            }
        }
    }
}